/*
 * @Author: aponder
 * @Date: 2020-04-15 11:17:35
 * @LastEditors: aponder
 * @LastEditTime: 2020-04-15 12:40:46
 * @FilePath: /leetcode-zh/easy/141.环形链表/Solution.java
 */
/*
 * @lc app=leetcode.cn id=141 lang=java
 *
 * [141] 环形链表
 *
 * https://leetcode-cn.com/problems/linked-list-cycle/description/
 *
 * algorithms
 * Easy (47.37%)
 * Likes:    560
 * Dislikes: 0
 * Total Accepted:    140K
 * Total Submissions: 294.9K
 * Testcase Example:  '[3,2,0,-4]\n1'
 *
 * 给定一个链表，判断链表中是否有环。
 * 
 * 为了表示给定链表中的环，我们使用整数 pos 来表示链表尾连接到链表中的位置（索引从 0 开始）。 如果 pos 是 -1，则在该链表中没有环。
 * 
 * 
 * 
 * 示例 1：
 * 
 * 输入：head = [3,2,0,-4], pos = 1
 * 输出：true
 * 解释：链表中有一个环，其尾部连接到第二个节点。
 * 
 * 
 * 
 * 
 * 示例 2：
 * 
 * 输入：head = [1,2], pos = 0
 * 输出：true
 * 解释：链表中有一个环，其尾部连接到第一个节点。
 * 
 * 
 * 
 * 
 * 示例 3：
 * 
 * 输入：head = [1], pos = -1
 * 输出：false
 * 解释：链表中没有环。
 * 
 * 
 * 
 * 
 * 
 * 
 * 进阶：
 * 
 * 你能用 O(1)（即，常量）内存解决此问题吗？
 * 
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null) { return false; }

        ListNode p1 = head.next;
        if (p1 == null) { return false; }
        ListNode p2 = p1.next;
        while (p1 != null && p2 != null) {
            if (p1 == p2) { return true; }
            p1 = p1.next;
            p2 = p2.next;
            if (p2 == null) { return false; }
            p2 = p2.next;
        }
        return false; 
    }
}
// @lc code=end

// Accepted
// 17/17 cases passed (0 ms)
// Your runtime beats 100 % of java submissions
// Your memory usage beats 5.49 % of java submissions (40.1 MB)